package com.semac.client.paginas.cadastro;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.semac.client.aplicacao.Pagina;
import com.semac.client.aplicacao.PaginasController;
import com.semac.client.rpc.PessoaRPCServices;
import com.semac.client.rpc.PessoaRPCServicesAsync;
import com.semac.shared.model.Pessoa;
import com.semac.shared.utils.FieldsUtils;

public class CadastroUI extends Composite implements Pagina{

	private PessoaRPCServicesAsync servico = PessoaRPCServices.Util.getInstance();
	
	private static CadastroUIUiBinder uiBinder = GWT.create(CadastroUIUiBinder.class);
	@UiField TextBox nomeTextBox;
	@UiField TextBox cartaoTextBox;
	@UiField TextBox emailTextBox;
	@UiField TextBox senhaTextBox;
	@UiField Button cadastrarButton;
	@UiField Label statusLabel;

	interface CadastroUIUiBinder extends UiBinder<Widget, CadastroUI> {
	}

	public CadastroUI() {
		initWidget(uiBinder.createAndBindUi(this));
	}

	@UiHandler("cadastrarButton")
	void onCadastrarButtonClick(ClickEvent event) {		
		this.cadastra(this.verificaCampos());
	}

	
	
	
	private void cadastra(final Pessoa pessoa) {
		if (pessoa == null)
			return;
		statusLabel.setText("Contatando servidor...");
		servico.cadastraPessoa(pessoa, new AsyncCallback<Integer>() {			
			@Override
			public void onSuccess(Integer result) {
				statusLabel.setText(pessoa.getNome() + ", você foi cadastrado com sucesso! Pode logar agora...");
			}
			
			@Override
			public void onFailure(Throwable caught) {
				statusLabel.setText(caught.getMessage());
			}
		});
	}
	
		
	/**
	 * Verifica se todos campos foram preenchidos corretamente e devolve uma instancia de pessoa
	 * @return
	 */
	private Pessoa verificaCampos() {
		this.statusLabel.setText("Verificando campos...");
		
		String nome, mail, senha;
		Integer cartao = 0;
		
		nome = this.nomeTextBox.getText().trim();
		mail = this.emailTextBox.getText().trim();
		senha = this.senhaTextBox.getText().trim();
		
		if (nome.equals("")){
			this.statusLabel.setText("Por favor insira um nome válido.");
			this.nomeTextBox.setFocus(true);
			return null;
		}else if (!FieldsUtils.isValidMail(mail) || mail.equals("")){
			this.statusLabel.setText("Por favor insira um mail válido.");
			this.emailTextBox.setFocus(true);
			return null;
		}else if (senha.equals("") || this.senhaTextBox.getText().trim().length() < 6){			
			this.statusLabel.setText("Por favor insira uma senha válida, de no mínimo 6 digitos.");
			this.senhaTextBox.setFocus(true);
			return null;
		}
		
		try{
			cartao = Integer.parseInt(this.cartaoTextBox.getText());
		}catch (Exception e) {
			this.statusLabel.setText("Isto não é um valor válido para o cartao.");
			return null;
		}
		
		return new Pessoa(nome, mail, cartao, senha);	
			
	}

	
	
	@Override
	public String getValorHistoryToken() {		
		return PaginasController.CADASTRO;
	}
	
	
	@UiHandler("cartaoTextBox")
	void onCartaoTextBoxBlur(BlurEvent event) {
		if (this.cartaoTextBox.getText().trim().equals(""))
			this.cartaoTextBox.setText("0");
	}
	
	@Override
	public Widget getView() {
		return this;
	}
}
